package cn.tedu.submarine;

import javax.swing.ImageIcon;
import java.awt.*;
import java.util.Random;

/**
 * 海洋对象类，是所有类的超类
 */
public abstract class SeaObject {
    /**
     * 活着的
     */
    public static final int LIVE = 0;
    /**
     * 死了的
     */
    public static final int DEAD = 1;
    private int state = LIVE; //当前状态(默认为活着的)

    private int width;  //宽
    private int height; //高
    private int x;      //x坐标
    private int y;      //y坐标
    private int speed;  //速度

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    //因为三种潜艇的width/height都是不一样的，所以数据不能写死，需传参写活
    //因为三种潜艇的x/y/speed代码都是一样的，所以数据可以写死，不需要传参
    /**
     * 专门给侦察潜艇、鱼雷潜艇、水雷潜艇提供的构造方法
     * @param width 潜艇的宽
     * @param height 潜艇的高
     */
    public SeaObject(int width,int height){
        this.width = width;
        this.height = height;
        x = -width;
        Random rand = new Random(); //创建随机数对象
        y = rand.nextInt(World.HEIGHT-height-150+1)+150; //150到(窗口高-潜艇高)之内随机生成
        speed = rand.nextInt(3)+1; //1到3之内随机生成
    }

    //因为三种对象的width/height/x/y/speed都是不一样的，所以数据不能写死，需传参写活
    /**
     * 专门给战舰、水雷、炸弹提供的构造方法
     * @param width 宽
     * @param height 高
     * @param x x坐标
     * @param y y坐标
     * @param speed 速度
     */
    public SeaObject(int width,int height,int x,int y,int speed){
        this.width = width;
        this.height = height;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }

    /**
     * 移动
     */
    public abstract void move();

    /**
     * 获取对象的图片
     * @return 返回对象所对应的图片
     */
    public abstract ImageIcon getImage();

    /**
     * 判断对象是否是活着的
     * @return 返回true表示活着的，否则表示死了的
     */
    public boolean isLive(){
        return state==LIVE; //若state为LIVE，表示活着的，返回true，否则返回false
    }

    /**
     * 判断对象是否是死了的
     * @return 返回true表示死了的，否则表示活着的
     */
    public boolean isDead(){
        return state==DEAD; //若state为DEAD，表示死了的，返回true，否则返回false
    }

    /**
     * 画对象
     * @param g 画笔
     */
    public void paintImage(Graphics g){
        if(this.isLive()){ //若活着的
            this.getImage().paintIcon(null,g,this.x,this.y); //----不要求掌握
        }
    }

}










